#pragma once
#include"rbtree.h"

namespace zjw
{
	template<class K,class V>
	class map {
		struct MAPOFKEY
		{
			const K& operator()(const pair<K,V>&kv)
			{ 

				return kv.first;
		
			}
		};

	public:
		typedef typename rbtree<K, pair< K,V>, MAPOFKEY>::iterator iterator;
		//typedef typename rbtree<K, pair<const K, V>, MAPOFKEY>::con_iterator con_iterator;
		
		iterator begin()
		{
			return _st.begin();

		}

		iterator end()
		{
			return _st.end();


		}
		pair<iterator, bool> insert(const pair<K, V>& kv)
		{

			return _st.insert(kv);


		}
		V& operator[](const K& key)
		{
			pair<iterator,bool> ret=_st.insert(make_pair(key, V()));
			return ret.first->second;
			
		
		}
	



	/*	con_iterator begin() const
		{
			return _st.begin();

		}

		con_iterator end() const
		{
			return _st.end();


		}*/
	

	private:
		rbtree<K, pair< K, V>, MAPOFKEY>_st;
	};
	void test_map()
	{
		string arr[] = { "string","string","apple" ,"apple", "blalala","blalala" };
		map<string, int>countmap;
		for (auto& e : arr)
		{
			countmap[e]++;

		}
		
	

	for (auto& kv : countmap)
		{
			cout << kv.first << ":" << kv.second << endl;



		}


	}



	//void testmap()
	//{
	//		//map< string,  int>sr;
	//		//sr.insert(make_pair("b", 1));
	//		//sr.insert(make_pair("think", 1));
	//		//sr.insert(make_pair("cool", 1));
	//		//map< string, int>::con_iterator it = sr.begin();
	//		////	//auto it = dic.begin();
	//		//while (it != sr.end())
	//		//{
	//		//	it->second += 1;
	//		//


	//		//	cout << it->first << ":" << it->second << endl;
	//		//	++it;
	//		//}
	//		//cout << endl;
	//	

	//	
	//}



}
